/**
 * @author liuxin
 * @e-mail lxtobe5@gmail.com
 * @update 2011.11.19
 */
package API_sample  
{
	import flash.display.Sprite;
	
	public class Argument_sample extends Sprite
	{
		private var count:int = 0;
		
		/**
		 *arguments 对象的一些重要方面包括：
		  ■ arguments 对象是一个数组，其中包括传递给函数的所有参数。
		  ■ arguments.length 属性报告传递给函数的参数数量。
		  ■ arguments.callee 属性提供对函数本身的引用，该引用可用于递归调用函数表达式。 
		 */		
		
		public function Argument_sample()
		{
			switch(2)
			{
				case 0:
					break;
				case 1:
					firstFunction(true);
					break;
				case 2:
					test(3,2,1);
			}
		}
		
		/**
		该函数调用名为 secondFunction() 的函数。firstFunction() 函数具有布尔参数 true，以证实 secondFunction() 成功调用了 firstFunction()，
		并防止各个函数因相互间调用而无限循环。因为 callSecond 参数为 true，所以 firstFunction() 调用 secondFunction()，并将一个对自身的引用作
		为唯一的参数传递。函数 secondFunction() 接收该参数并使用名为 caller 的参数存储它，该参数属于 Function 数据类型。然后，使用 secondFunction()
		中的 caller 参数来调用 firstFunction 函数，但这次将 callSecond 参数设置为 false。
		*/
		
		private function firstFunction(callSecond:Boolean):void
		{
			trace(count + ": firstFunction");
			if(callSecond) {
				secondFunction(arguments.callee);   //arguments.callee就是firstFunction(callSecond:Boolean)
			}
			else {
				trace("CALLS STOPPED");
			}
			trace(arguments.length);
		}
		
		private function secondFunction(caller:Function):void
		{
			trace(count + ": secondFunction\n");
			count++;
			caller(false);
		}
		
		//递归特性
		private function test(a:int,b:int,c:int):void
		{
			trace("arguments:"+arguments);
			trace("arguments.callee:"+arguments.callee);
			trace("arguments.length:"+arguments.length);
			
			for (var i:uint = 0; i < arguments.length; i++)
			{
				trace("参数"+(i+1)+":"+arguments[i]);
			}
			if(a+b+c>0)
			{
				arguments.callee(a-1,b-1,c-1);
			}
		}
	}
}